package cn.kgc.spring.aspects;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author 课工场
 * @date 2024/4/30
 * @description 编写增强的业务功能  通知  通知类
 * 切面:  切点+通知
 */
@Component
@Aspect   // 标识类是切面类
public class TimeAspect {

    // @Pointcut("execution(*  cn.kgc.spring.service.impl.TeacherServiceImpl.teach*(..))")
    @Pointcut("@annotation(cn.kgc.spring.annotations.TimeAdvice)")
    public void point() {
    }

    // 前置通知
    @Before("point()")
    public void beforeAdvice() {
        System.out.println("上课时间到了，请开始上课");
    }

    // 后置通知   目标方法在正确执行后增强的通知
    // @AfterReturning("execution(*  cn.kgc.spring.service.impl.TeacherServiceImpl.teach*(..))")
    @AfterReturning("point()")
    public void afterReturningAdvice() {
        System.out.println("下课时间到了，请准时下课");
    }

    //@After("")
    // 最终通知   无论目标方法是否正确执行都要增强的通知
    public void afterAdvice() {
        System.out.println("--------最终通知------");
    }

    // 异常通知  目标方法执行抛出异常后 增强的通知
    // @AfterThrowing("")
    public void afterThrowingAdvice() {
        System.out.println("------异常通知------");
    }

    // 环绕通知
    // @Around("")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) {

        try {

            System.out.println("上课时间到了，请开始上课");

            //  目标方法执行   分割点
            Object proceed = joinPoint.proceed();

            System.out.println("下课时间到了，请准时下课");

            return proceed;

        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

    }


}
